/***********************************************************************
 * Module:  ModeleCarteDrawer.java
 * Author:  Fabien Muguet
 * Purpose: Defines the Class CartePostaleDrawer
 ***********************************************************************/

package vue.composants;

import modele.*;

import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;


public class EcranModeleCPD extends CartePostaleDrawer {


    // Indique si le modèle est selectionnée
    private boolean selectionne = false;


    public EcranModeleCPD(Ressources ressources, CartePostale cartePostale, String etapeCreation, Dimension dimension, MouseListener ecouteur) {

        super(ressources, cartePostale, etapeCreation, dimension);

        // On ajoute l'écouteur
        addMouseListener(ecouteur);

        // Curseur "main" pour indiquer qu'il faut cliquer
        setCursor( Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) );

    }
    
    public void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D)g;
        int i, x, y, w, h;


        // ------------------------------
        // Dessin du fond
        // ------------------------------
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width, height);


        // ------------------------------
        // Dessin des zones d'image
        // ------------------------------

        // On récupère la zone de texte à afficher
        ZoneImage zImage[] = cartePostale.getModele().getZoneImage();

        // Couleur des zones
        //Color coulFondZone = new Color(210, 210, 225);
        Color coulFondZone = Color.WHITE;
        Color coulBordZone = new Color(150, 150, 150);

        // On boucle pour chaque zone
        for(i=0; i < zImage.length; i++) {

            // On redimensionne les coordonnées à l'échelle
            x = redim(zImage[i].getPosX());
            y = redim(zImage[i].getPosY());
            w = redim(zImage[i].getWidth());
            h = redim(zImage[i].getHeight());

            /* T0D0 : prise en compte des rotations */

            // On dessine le rectangle
            g.setColor(coulFondZone);
            g.fillRect(x, y, w, h);
            g.setColor(coulBordZone);
            g.drawRect(x, y, w, h);

            // On rajoute un picto image et un chiffre par dessus
            BufferedImage pictoImage = ressources.getPictoImage();
            if( pictoImage != null ) {
                x += (w - pictoImage.getWidth())/2;
                y += (h - pictoImage.getHeight())/2;

                Font font = new Font("Verdana", Font.BOLD, 14);

                // Picto image
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f ));
                g.drawImage(pictoImage, x, y, this);

                // Chiffre
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f ));
                g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2d.setFont(font);
                g2d.setColor( new Color(65, 95, 140) );
                g2d.drawString( new Integer(i+1).toString() , x+7, y+30);
            }

        }


        // ------------------------------
        // Dessin du texte
        // ------------------------------

        // On récupère la zone de texte à afficher
        ZoneTexte zTexte = cartePostale.getModele().getZoneTexte();

        // Texte, police et couleur du texte
        String texte = "<Votre texte ici>";
        Font font = new Font("Verdana", Font.PLAIN, redim(zTexte.getTailleFont()));
        g2d.setColor(Color.BLACK);
        g2d.setFont(font);

        // On redimensionne la coordonnée à l'échelle
        x = redim(zTexte.getPosX());
        y = redim(zTexte.getPosY());

        // On détermine la taille du texte pour pouvoir centrer
        FontMetrics metrics = new FontMetrics(font) {};
        Rectangle2D bounds = metrics.getStringBounds(texte, null);
        int widthInPixels = (int)bounds.getWidth();
        int heightInPixels = (int)bounds.getHeight();

        // On écrit le texte centré
        g2d.drawString(texte, x-(widthInPixels/2), y-(heightInPixels/2));


        // ------------------------------
        // Modèle selectionné
        // ------------------------------

        if( selectionne ) {
            // Si selectionné, on ajoute une couche opaque
            g2d.setColor(Color.YELLOW);
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f ));
            g.fillRect(0, 0, width, height);
        }

    }



    /**
     * Définit si le modèle est selectionné.
     * Note : la selection ajoute un filtre opaque lors de l'affichage.
     *
     * @param estSelectionne Booléen indiquant si le modele est selectionné.
     */
    public void setSelectionne(boolean estSelectionne) {
        this.selectionne = estSelectionne;
    }


    /**
     * Vérifie la validité de l'étape de création fournie.
     *
     * @param etapeCreation L'étape de création
     * @return true si l'étape existe, false sinon
     */
    public boolean verifEtapeCreation(String etapeCreation) {
        return (etapeCreation == "modele");
    }
}